#ifndef __PCF8563_H
#define __PCF8563_H

#include "stdint.h"


// -------------------------- 文档定义的关键参数 --------------------------
#define PCF8563_ADDR_WRITE 0xA2  // 从机写地址（文档8.5/9.5.1）
#define PCF8563_ADDR_READ  0xA3  // 从机读地址（文档8.5/9.5.1）

// 寄存器地址（文档8.2表4）
#define PCF8563_CTRL_STATUS1  0x00  // 控制状态寄存器1（含STOP位）
#define PCF8563_CTRL_STATUS2  0x01  // 控制状态寄存器2
#define PCF8563_VL_SECONDS    0x02  // 秒寄存器（含VL位）
#define PCF8563_MINUTES       0x03  // 分寄存器
#define PCF8563_HOURS         0x04  // 时寄存器
#define PCF8563_DAYS          0x05  // 日寄存器
#define PCF8563_WEEKDAYS      0x06  // 星期寄存器
#define PCF8563_CENT_MONTHS   0x07  // 世纪+月寄存器
#define PCF8563_YEARS         0x08  // 年寄存器

// STOP位（文档8.10）：CTRL_STATUS1的bit5，1=冻结时间，0=释放
#define PCF8563_STOP_BIT      (1 << 5)
// VL位（文档8.4.1）：VL_SECONDS的bit7，1=时间无效，0=时间有效
#define PCF8563_VL_BIT        (1 << 7)
// 世纪位（文档8.4.6）：CENT_MONTHS的bit7，1=下一个世纪（如21xx），0=当前世纪（如20xx）
#define PCF8563_CENTURY_BIT   (1 << 7)

// 时间结构体（存储十进制时间，便于应用层使用）
typedef struct {
    uint8_t seconds;    // 0~59
    uint8_t minutes;    // 0~59
    uint8_t hours;      // 0~23
    uint8_t days;       // 1~31
    uint8_t weekdays;   // 0~6（0=周日，文档8.4.5表14，可自定义）
    uint8_t months;     // 1~12
    uint8_t years;      // 0~99（配合世纪位表示完整年份）
    uint8_t century;    // 0=20xx，1=21xx（来自CENT_MONTHS的bit7）
    uint8_t time_valid; // 0=时间有效，1=时间无效（VL位置位）
} PCF8563_TimeTypeDef;


// 底层I2C函数声明（需根据实际硬件实现，此处为示例接口）
uint8_t rtc_I2C_Start(void);                  // I2C发送START条件
uint8_t rtc_I2C_SendAddr(uint8_t addr);       // 发送I2C从机地址（含读/写位）
uint8_t rtc_I2C_SendData(uint8_t data);       // 发送1字节数据
uint8_t rtc_I2C_ReadData(uint8_t *pdata, uint8_t ack); // 读1字节（ack=1需应答，0=无应答）
void rtc_I2C_Stop(void);                      // I2C发送STOP条件


// -------------------------- 函数声明 --------------------------
/**
 * @brief  PCF8563初始化（冻结时间→清除VL位→释放时间）
 * @retval 0=成功，1=失败
 */
uint8_t PCF8563_Init(void);

/**
 * @brief  BCD码转十进制（文档8.4：时间寄存器为BCD格式）
 * @param  bcd_val: BCD码值（如0x59→59）
 * @retval 十进制值
 */
uint8_t BCD_to_Dec(uint8_t bcd_val);

/**
 * @brief  十进制转BCD码（文档8.4：写寄存器需BCD格式）
 * @param  dec_val: 十进制值（如59→0x59）
 * @retval BCD码值
 */
uint8_t Dec_to_BCD(uint8_t dec_val);

/**
 * @brief  写入时间到PCF8563（一次性写02h~08h寄存器）
 * @param  pTime: 指向时间结构体的指针
 * @retval 0=成功，1=失败（I2C错误或时间非法）
 */
uint8_t PCF8563_WriteTime(PCF8563_TimeTypeDef *pTime);

/**
 * @brief  从PCF8563读取时间（一次性读02h~08h寄存器）
 * @param  pTime: 指向存储时间的结构体指针
 * @retval 0=成功，1=失败（I2C错误）
 */
uint8_t PCF8563_ReadTime(PCF8563_TimeTypeDef *pTime);

#endif // __PCF8563_H


